import Vue from 'vue';
import VueRouter from 'vue-router';
import routes from './routes';
import store from '@/store';
// 使用路由插件
Vue.use(VueRouter);
// ===================================================== //
// 解决push和replace的bug
const originalPush = VueRouter.prototype.push;
VueRouter.prototype.push = function (location) {
  return originalPush.call(this, location, () => { });
}
const originalReplace = VueRouter.prototype.replace;
VueRouter.prototype.replace = function (location) {
  return originalReplace.call(this, location, () => { });
}
// ===================================================== //


const router = new VueRouter({
  routes,
  mode:"history",
  scrollBehavior(to, from, savedPosition) {
    return { x: 0, y: 0 };
  }
});
// 全局前置路由守卫，页面初始化的时候执行一次，路径发生切换之前执行
// 
router.beforeEach(async (to, from, next) => {
  let token = store.state.user.token;
  let name = store.state.user.userInfo.name;
  // 登录了
  if (token) {
    // 处理手输地址栏的情况，跳转的是login
    if (to.path == '/login') {
      // 返回home
      next('/home');
    } else {
      // 如果登陆了，并且跳转的是其他页面，用户信息丢失了
      if(!name){
        try {
          // 用户名丢失了重新发请求获取
          await store.dispatch('user/userInfo');
          // 请求成功了，用户信息找回来了
          next();
        } catch (error) {
          // token过期了,或者token被伪造，被篡改了就会导致请求失败，需要重新登录
          // 不能直接跳到登录页面，这样会死循环的，会一直发请求，一直获取用户信息，因为此时token还在，但是是非法的或者过期的
          // 必须先清除token，清除用户信息，然后重新登录
          await store.dispatch('user/userLogout');
          next('/login');
        }
      }
    }
    next();
  } else {
    // 如果没有登录
    // to.meta.isAuth为true是需要登录的页面
    if(to.meta.isAuth){
      if(confirm('您还没登录,是否前往登录？')){
        next('/login');
      }
    }else {
      // 不需要登录的页面直接跳转
      next();
    }
  }
});
router.afterEach((to, from) => {
  // console.log('后置路由守卫', to, from)
  
  // let token = store.state.user.userInfo.token

  document.title = to.meta.title ? to.meta.title : '首页';
  // document.title = to.meta.title || '我的系统'
})
export default router;